home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 158_01 / qe4 < prev    next >
Text File  |  1987-10-10  |  6KB  |  303 lines

  1. /*  VERSION 0007  (DATE: 16/12/86)  (TIME: 22:57)  */
  2. /*
  3.     e (qe) screen editor
  4.  
  5.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  6.  
  7.     August-December 1981
  8.     Modified: To QE from e (ver 4.6a) by J.W. Haefner -- Oct 84-Mar 85
  9.  
  10.     FILE: qe4
  11.  
  12.     FUNCTIONS: info,findorrep,dofindrep,find
  13.  
  14.     PURPOSE: perform find, alter and repeat commands
  15.  
  16. */
  17.  
  18. #include "qe.h"
  19.  
  20. info()
  21. {
  22.     char c;
  23.     int from,to,line;    /*non-empty lines to reform*/
  24.  
  25. #if (WWRAP)
  26.     if (expert) xprtmess("F/A/P/Y/K/L/O ? ");
  27.     else
  28.        putmess("|F|ind |A|lter |P|aragraph |Y|(DEL-EOL) |K|ontext |L|ine nums toggle |O|nscrn Help ");
  29.     while ((c = getlow()) != 'a' && c != 'f' && c != 'p' && c != 'k' &&
  30.             c!='l' && c!='o' && c != 'y' && c != ESCKEY);
  31. #else    /*no word wrap*/
  32.     if (expert) xprtmess("F/A/Y/K/L/O ? ");
  33.     else
  34.        putmess("|F|ind |A|lter |Y|(DEL-EOL) |K|ontext |L|ine nums toggle |O|nscrn Help ");
  35.     while ((c = getlow()) != 'a' && c != 'f' && c != 'k' &&
  36.           c!='l' && c!='o' && c != 'y' && c != ESCKEY);
  37. #endif   /*wrap*/
  38.  
  39. if (c == ESCKEY) goto clear;
  40. switch (c)  {
  41.     case 'f':
  42.         replace = NO;
  43.         findorrep();
  44.         break;
  45.     case 'a':
  46.         replace = YES;
  47.         findorrep();
  48.         break;
  49. #if WWRAP
  50.     case 'p':
  51.         puttext();
  52.         if (!text[0]) moveline(1);
  53.         else  {
  54.             from=to=line=cline;
  55.             if (cline!=lastl)
  56.                 do {
  57.                     gettext(++line);
  58.                     to++;
  59.                 } while     ((cline<=lastl) &&
  60.                     (c=text[0]) && (!((c==' ')||(c=='\t'))) );
  61.             else to++;            /*"to" must be 1 more than text to refrm*/
  62.             reform(from,to);
  63.             changed=YES;
  64.             putpage();
  65.             }
  66.         break;
  67. #endif   /*word wrap*/
  68.     case 'y':
  69.             /* save deleted portion for later recovery */
  70.         strcpy(textb,&text[charn]);
  71.         deleteline((cursorx-offset),cursory);
  72.         altered = changed = YES;
  73.         text[charn] = '\0';
  74.         break;
  75.     case 'k':
  76.         envir();
  77.         break;
  78.     case 'l':
  79.         displaypos = !displaypos;
  80.         deleteline(LNPOS,0);
  81.         putlineno(cline);
  82.         return;
  83.     case 'o':
  84.         if (helpon) {
  85.             helpon = NO;
  86.             unmess();
  87.             }
  88.         else {
  89.             helpon=YES;
  90.             dohelp();
  91.             }
  92.         break;
  93.     }
  94. clear:
  95.     if (expert) xmessoff();
  96. }
  97.  
  98. findorrep()
  99. {
  100.     int  toend, global, i, count;
  101.     char c;
  102.  
  103.     if (expert) {
  104.         deleteline(0,0);
  105.         puts("Find|:(^]=esc)|? ");
  106.         }
  107.     else putmess("Find|(^]=ESC)|? ");
  108.     global=nocheck=toend=NO;
  109.     findir=1; 
  110.     count=0;
  111.     c=scans(patt,FLIM);
  112.     if (c==ESCKEY) goto clrfind;
  113.     if (replace) {
  114.         if (c == ESCKEY) goto clrfind;
  115.         if (expert) {
  116.             deleteline(0,0);
  117.             puts("Alter|:(^]=esc)|? ");
  118.             }
  119.         else putmess("Alter to|(^]=ESC)|? ");
  120.         c=scans(changeto,FLIM);
  121.         }
  122.     else if (!patt[0]) goto clrfind;
  123.     if (c == CR) {
  124.         if (replace) {
  125.             if (expert) xprtmess("B/G/T/W/n ? ");
  126.             else
  127.               putmess("B|ack/|G|lobal/|T|o end (start)/|W|ithout asking/number |? ");
  128.             }
  129.         else
  130.             if (expert) xprtmess("B|kwrds/n|? ");
  131.             else putmess("|Search |B|ackwards/number|? ");
  132.         if (scans(opts,5) == ESCKEY) goto clrfind;
  133.         for (i=0; (c=opts[i]); i++) {
  134.             switch(tolower(c)) {
  135.             case 'g' : 
  136.                 global=YES;
  137.             case 't' : 
  138.                 toend=YES;
  139.                 break;
  140.             case 'b' : 
  141.                 findir=-1; 
  142.                 break;
  143.             case 'w' : 
  144.                 nocheck=YES; 
  145.                 break;
  146.                 }
  147.             if (c >= '0' && c <= '9') count=count*10+c-'0';
  148.             }
  149.         if (!replace) {
  150.             global=NO; 
  151.             toend=NO;
  152.             }
  153.         if (count == 0) {
  154.             if (toend) count=MAXINT;
  155.             else count=1;
  156.             }
  157.         if (global) {
  158.             findir=1;
  159.             moveline(1-cline);
  160.             sync(0);
  161.             }
  162.         }
  163.     else count=1;
  164.     dofindrep(count);
  165. clrfind:
  166.     if (expert) {
  167.         /*
  168.         gotoxy(0,0);
  169.         for (i=0;i<FNPOS;i++) puts(" ");
  170.         */
  171.         deleteline(0,0);
  172.         putstatusline();
  173.         resetcursor();
  174.         }
  175. }
  176.  
  177. dofindrep(count)
  178. int count;
  179. {
  180.     int cp, i, len;
  181.     char c;
  182.  
  183.     puttext();
  184.     do {
  185.         count--;
  186.         if (find() == FAIL) count=0;
  187.         else if (replace) {
  188.             if (nocheck) c='y';
  189.             else {
  190.                 gotoxy(EMPOS,0);
  191.                 puts("     Replace |{|Y|/|N|}|? ");
  192.                 do {
  193.                     gotoxy(REPPOS,0);
  194.                     for (i=0; i < 1000; i++);
  195.                     resetcursor();
  196.                     for (i=0; i < 1000; i++);
  197.                     } 
  198.                 while ((c=testlow()) != 'y' && c != 'n'
  199.                 && c != ESCKEY);
  200.                 }
  201.             deleteline(EMPOS,0);
  202.             switch(c) {
  203.             case 'y' :    
  204.                 if (strlen(text)+(len=strlen(patt)) >= LLIM) {
  205.                     error("Line would be too long"); 
  206.                     return;
  207.                     }
  208.                 for (cp=charn; (text[cp]=text[cp+len]); cp++);
  209.                 for (cp=strlen(text), len=strlen(changeto); 
  210.                     cp >= charn; cp--)
  211.                         text[cp+len]=text[cp];
  212.                 for (i=0; (c=changeto[i]); i++) text[charn++]=c;
  213.                 altered=YES; 
  214.                 puttext();
  215.                 rewrite(++cp,cursorx);
  216.                 sync(charn);
  217.                 break;
  218.             case ESCKEY:
  219.                 count=0;
  220.                 error("Search stopped");
  221.             case 'n' :
  222.                 movechar(findir); 
  223.                 break;
  224.                 }
  225.             }
  226.         } 
  227.     while(count);
  228.     inbufp=0;
  229. }
  230.  
  231. find()    /*find 'patt', searching back (findir==-1) or forwards (1) from
  232.       current line.  Return FAIL or YES, and set current line to
  233.       that containing pattern*/
  234. {
  235.     int fline, oldcharn, newcharn, interupt, linecount, pos;
  236.     char *s, pattch1, *p, *t, *getline();
  237.  
  238.     if (!replace || repeat) movechar(findir);
  239.     fline=cline;  
  240.     oldcharn=charn; 
  241.     interupt=NO;
  242.     linecount= cline%100;
  243.     pattch1=patt[0];
  244.     gotoxy(WAITPOS,0);
  245.     if (findir == 1)
  246.         while (fline <= lastl) {
  247.             if (linecount++ == 100) {
  248.                 linecount=1; 
  249.                 putlineno(fline);
  250.                 gotoxy(WAITPOS,0);
  251.                 if (testkey() == ESCKEY) {
  252.                     interupt=YES;
  253.                     goto interrupted;
  254.                     }
  255.                 }
  256. /*            for (s=getline(fline)+charn; *(p=s); charn++,s++)
  257.                 if (*s == pattch1) {
  258.                     for (t=patt+1, p++; *t && *p == *t; p++, t++);
  259.                     if (!*t) goto foundit;
  260.                     }   */
  261.             if ( (pos=index(getline(fline)+charn,patt)) != FAIL) {
  262.                 charn+=pos;
  263.                 goto foundit;
  264.                 }
  265.             fline++; 
  266.             charn=0;
  267.             }
  268.     else
  269.     while (fline >= 1) {
  270.         if (linecount-- == 0) {
  271.             linecount=99; 
  272.             putlineno(fline);
  273.             gotoxy(WAITPOS,0);
  274.             if (testkey() == ESCKEY) {
  275.                 interupt=YES;
  276.                 goto interrupted;
  277.                 }
  278.             }
  279.         for (s=getline(fline); charn >= 0; charn--)
  280.             if (*(p=&s[charn]) == pattch1) {
  281.                 for (t=patt+1,p++; *t && *p == *t; p++, t++);
  282.                 if (!*t) goto foundit;
  283.                 }
  284.         charn=strlen(getline(--fline))-1;
  285.         }
  286. interrupted:
  287.     charn=oldcharn; 
  288.     if (!replace || repeat) movechar(-findir);
  289.     if (interupt) {
  290.         error("Search aborted");
  291.         putlineno(cline);
  292.         }
  293.     else error("       Search fails");
  294.     return FAIL;
  295.  
  296. foundit:
  297.     newcharn=charn; 
  298.     moveline(fline-cline); 
  299.     sync(charn=newcharn);
  300.     return YES;
  301. }
  302. n; cp--)
  303.                         text[cp+len]=te